alias cargo='cargo_with_args'

export CARGO_PROJECT_TARGET="/home/rust" # 设定的target的目录

# 覆盖于操作cargo命令
cargo_with_args() {
  # 定义支持 "--target-dir" 参数的 Cargo 命令列表
  local supported_commands=("build" "run" "test" "bench" "doc" "rustc" "check")
  local is_supported=false

  # 通过命令行参数的第一个值来确定是否为支持的命令
  for cmd in "${supported_commands[@]}"; do
    if [[ "$1" == "$cmd" ]]; then
      is_supported=true
      break
    fi
  done

  if ! $is_supported; then
    # 如果命令不支持 "--target-dir" 参数，则正常执行命令并返回
    command cargo "$@"
    return
  fi

  # 设定一个标志变量，表示是否找到 "--target-dir" 参数
  local has_target_dir=false

  # 遍历所有传入的参数来寻找 "--target-dir"
  for arg in "$@"; do
    if [[ $arg == "--target-dir"* ]]; then
      has_target_dir=true
      break
    fi
  done

  if $has_target_dir; then
    # 如果已经有 "--target-dir" 参数，直接执行命令
    command cargo "$@"
  else
    # 如果没有找到 "--target-dir" 参数，则获取相关路径
    temp_path=$(rr_l) # 从函数获取输出，得到rust项目的根目录名称

    # 检查 temp_path 是否为空，如果为空则报错并退出
    if [[ -z "$temp_path" ]]; then
        echo "Error: 'rr_l' - no rust path." >&2
        return 1 # Return with error
    fi

    COMBINED_PATH="${CARGO_PROJECT_TARGET}/${temp_path}" # 路径拼接

    command cargo "$@" --target-dir="$COMBINED_PATH"
  fi
}


# 查找rust项目的根目录
find_cargo_up() {
   path=$(pwd)
    while [[ "$path" != "" ]]; do
        # 检查当前路径下是否存在 Cargo.toml 文件和 Cargo.lock 文件或 .git 目录
        if [[ -e "$path/Cargo.toml" && ( -e "$path/Cargo.lock" || -d "$path/.git" ) ]]; then
            echo "$path"
            return
        fi
        path=${path%/*}
    done
}

# 工具函数，用于查找当前路径的最后一级
rr_l() {
    local last_dir_name=""
    local rust_project_root
    rust_project_root=$(find_cargo_up)

    if [[ "$rust_project_root" != "" ]] ; then
        last_dir_name=$(basename "$rust_project_root")
    fi

    echo "$last_dir_name"
    # some_command "$@" "$last_dir_name"
}
